package com.example.mysingledemo;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.util.Enumeration;

import javax.crypto.Cipher;

import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;

public class Main2Activity extends AppCompatActivity {
    String contents="我爱你我的家，我的家，我的天堂，哦哦哦哦哦，生活在这篇炽热的大土地上，" +
            "我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。"+
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀"+
            "我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。"+
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀"+
            "我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。"+
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀"+
            "我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。"+
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀"+
            "我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。"+
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀"+
            "我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。"+
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀"+
            "我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。"+
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀"+
            "我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。"+
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀"+
            "我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。"+
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀"+
            "我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。"+
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀"+
            "我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。"+
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀"+
            "我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。"+
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀"+
            "我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。"+
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀"+
            "我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。"+
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀" +
            "长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀";
   /*
   * 我爱你我的家，我的家，我的天堂，哦哦哦哦哦，生活在这篇炽热的大土地上，我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的
   * 是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，
   * 远方归来的我每次站在你的胸怀闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。长大后依然
   * 带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀长大后依然带
   * 不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀我心烧似火，不
   * 敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，长大后依然带不给了给它
   * 美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀闭着眼睛，就是小时候被你
   * 蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不
   * 曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不
   * 曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是
   * 自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自
   * 豪和光荣联系到一起，远方归来的我每次站在你的胸怀闭着眼睛，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄
   * 土大地。长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你
   * 的胸怀长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的
   * 胸怀我心烧似火，不敢围攻。天堂在左右，我举步维艰，最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，长大
   * 后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀闭着眼睛
   * ，就是小时候被你蠢着的幸福场景。远方的我，只怕被你忘记，我亲爱的黄土大地。长大后依然带不给了给它美丽而且富饶的肌肤和美丽。
   * 我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀长大后依然带不给了给它美丽而且富饶的肌肤和美丽。
   * 我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀我心烧似火，不敢围攻。天堂在左右，我举步维艰，
   * 最终我相信我走的是自己脚下那片炽热的大地，小时候用黑瘦的身躯踩踏着，长大后依然带不给了给它美丽而且富饶的肌肤和美丽。
   * 我似乎死活都不曾与它的自豪和光荣联系到一起，远方归来的我每次站在你的胸怀闭着眼睛，就是小时候被你蠢着的幸福场景。
   * 远方的我，只怕被你忘记，我亲爱的黄土大地。长大后依然带不给了给它美丽而且富饶的肌肤和美丽。我似乎死活都不曾与它的自豪和光荣联系到一起，远方�

    *
   * */

    String jiami;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        SAXReader saxReader = new SAXReader();
        try {
            InputStream in = getAssets().open("seal.xml");
            Document document = saxReader.read(in);
            Element root = document.getRootElement();
            Element element;
            element=(Element)root.elementIterator("seal").next();
//            return sealXML.bufferChange(element.elementText("sealPicture"));
//            sealXML.bufferChange(element.elementText("sealCer"));
            save(sealXML.bufferChange(element.elementText("sealPicture")),"seal.png");
            save(sealXML.bufferChange(element.elementText("sealCer")),"seal.p12");


        }
        catch (IOException | DocumentException e)
        {
            e.printStackTrace();
        }

    }
    //加密
    public void JiaMi(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    jiami=InfoToBASE64(encrypt(contents));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }
    //解密
    public void JieMi(View view) {
        new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        BASE64Decoder decoder=new BASE64Decoder();
                        try {
                            byte[] decryptedData= decoder.decodeBuffer((bufferChange(jiami)));//解码后的加密信息
                            String jieMi=new String(decrypt(decryptedData), "UTF8");
                            Log.e("解密之后:",jieMi);
                        } catch (IOException e) {
                            e.printStackTrace();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
        ).start();
    }

    //TODO 加密
    private String InfoToBASE64(byte[] info){
        BASE64Encoder encoder=new BASE64Encoder();
        return encoder.encode(info);
    }
    private byte[]  encrypt(String information) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        //TODO 这里 进行公钥签名
        cipher.init(Cipher.ENCRYPT_MODE,readPrivate());
        //TODO 重要：这里是加密之后的数据。
        int inputLen = information.getBytes().length;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int offSet = 0;
        byte[] cache;
        int i = 0;
        // 对数据分段解密
        while (inputLen - offSet > 0) {
            if (inputLen - offSet > 117) {
                cache = cipher.doFinal(information.getBytes(), offSet, 117);
            } else {
                cache = cipher.doFinal(information.getBytes(), offSet, inputLen - offSet);
            }
            out.write(cache);
            i++;
            offSet = i * 117;
        }
        byte[] decryptedData = out.toByteArray();
        out.close();





        //byte[] msg1=cipher.doFinal(information.getBytes());//加密后的数据
        //System.out.println("加密后：  "+new String(msg1,"UTF8"));
        return decryptedData;
    }
    private PrivateKey readPrivate(){
        //文档密码
        String keyStore_password = "scsrsy";
        try {
            //根据类型获取keyStore（密钥和证书的存储设施）
            KeyStore keyStore = KeyStore.getInstance("PKCS12");
            //打开证书
            FileInputStream fileInputStream = openFileInput("seal.p12");

            //密码的局部变量，因为后面会用到的密码是字符数组，所以使用字符数组
            char[] password = null;
            if (keyStore_password.trim().equals("")) {
                password = null;
            } else {
                password = keyStore_password.toCharArray();
            }
            //创建一个字节数组，定义len记录长度
            /*int len = 0;
            byte[] buf = new byte[1024];
            StringBuilder builder=new StringBuilder();
            while((len=fileInputStream.read(buf))!=-1){
                builder.append(new String(buf,0,len));
                System.out.println(new String(buf,0,len));
            }

            Log.e("seal.p12.topath=",builder.toString());*/
            //用密码加载keyStore
            keyStore.load(fileInputStream, password);
            fileInputStream.close();


            //获取别名的枚举类型
            Enumeration enumeration = keyStore.aliases();
            //别名
            String keyAlias = null;
            if (enumeration.hasMoreElements()) {
                keyAlias = (String) enumeration.nextElement();
                Log.e("keyAlias=",keyAlias);

            }

            //利用别名直接加载私钥
            PrivateKey privateKey = (PrivateKey) keyStore.getKey(keyAlias, password);

            return privateKey;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }


    //TODO 解密开始
    private static String bufferChange(String msg){
        String buffer = "";

        String[] pic = msg.split(" ");
        for (int i = 0;i < pic.length; i++){
            if (i != pic.length-1 ) buffer += (pic[i] + "\r" + "\n");
            else buffer += pic[i];
        }
        return buffer;
    }

    private byte[] BASE64ToInfo(String base)throws  Exception{
        BASE64Decoder decoder=new BASE64Decoder();
        return decoder.decodeBuffer(base);
    }

    private byte[]  decrypt(byte[] encryptedData) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, readPublic("seal.p12"));
        // 解密byte数组最大长度限制: 256
        int inputLen = encryptedData.length;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int offSet = 0;
        byte[] cache;
        int i = 0;
        // 对数据分段解密
        while (inputLen - offSet > 0) {
            if (inputLen - offSet > 256) {
                cache = cipher.doFinal(encryptedData, offSet, 256);
            } else {
                cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
            }
            out.write(cache);
            i++;
            offSet = i * 256;
        }
        byte[] decryptedData = out.toByteArray();
        out.close();
        return decryptedData;
    }
    public PublicKey readPublic(String path){
        String keyStore_password = "scsrsy";
        try {
            //根据类型获取keyStore（密钥和证书的存储设施）
            KeyStore keyStore = KeyStore.getInstance("PKCS12");
            //打开证书
            FileInputStream fileInputStream = openFileInput(path);
            //密码的局部变量，因为后面会用到的密码是字符数组，所以使用字符数组
            char[] password = null;
            if (keyStore_password.trim().equals("")){
            }else{
                password = keyStore_password.toCharArray();

            }
            //用密码加载keyStore
            keyStore.load(fileInputStream,password);
            fileInputStream.close();
            //证书类型

            //获取别名的枚举类型
            Enumeration enumeration = keyStore.aliases();
            //别名
            String keyAlias = null;
            if (enumeration.hasMoreElements()){
                keyAlias = (String) enumeration.nextElement();
            }
            //获取证书
            Certificate certificate = keyStore.getCertificate(keyAlias);
            //公钥获取
            PublicKey publicKey = certificate.getPublicKey();

            return publicKey;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /*
     msg是传入的文件信息
      */
    public void save(String file,String filePath){
        if (file == null)
            return;
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            byte[] b = decoder.decodeBuffer(file);
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {
                    b[i] += 256;
                }

            }
            FileOutputStream out = openFileOutput(filePath, Context.MODE_PRIVATE);
            out.write(b);
            out.flush();
            out.close();


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
